import * as CryptoJS from 'crypto-js';
import JSEncrypt from 'jsencrypt';
import config from "@/config";

const crypto = {
    // MD5
    MD5: {
        /**
         * MD5 加密
         * @param data 待加密内容
         * @returns {*} 加密后结果
         */
        encrypt: (data) => {
            return CryptoJS.MD5(data).toString()
        }
    },
    // BASE64
    BASE64: {
        /**
         * BASE64 加密
         * @param data 待加密内容
         * @returns {string} 加密后结果
         */
        encrypt: (data) => {
            return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data))
        },
        /**
         * BASE64 解密
         * @param cipher 待解密内容
         * @returns {string} 解密后结果
         */
        decrypt: (cipher) => {
            return CryptoJS.enc.Base64.parse(cipher).toString(CryptoJS.enc.Utf8)
        }
    },
    // AES
    AES: {
        /**
         *  AES 加密
         * @param data 待加密内容
         * @param secretKey 加解密密钥
         * @param config 加密配置
         * @returns {string} 加密后结果
         */
        encrypt: (data, secretKey, config = {}) => {
            if (secretKey.length % 8 !== 0) {
                throw new Error("秘钥长度必须为8的倍数，否则解密将会失败！")
            }
            let result = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(secretKey), {
                iv: CryptoJS.enc.Utf8.parse(config.iv || ""),
                mode: CryptoJS.mode[config.mode || "ECB"],
                padding: CryptoJS.pad[config.padding || "Pkcs7"]
            })
            return result.toString()
        },
        /**
         * AES 解密
         * @param cipher 待解密内容
         * @param secretKey 加解密密钥
         * @param config 解密配置
         * @returns {*} 解密后结果
         */
        decrypt: (cipher, secretKey, config = {}) => {
            let result = CryptoJS.AES.decrypt(cipher, CryptoJS.enc.Utf8.parse(secretKey), {
                iv: CryptoJS.enc.Utf8.parse(config.iv || ""),
                mode: CryptoJS.mode[config.mode || "ECB"],
                padding: CryptoJS.pad[config.padding || "Pkcs7"]
            })
            return CryptoJS.enc.Utf8.stringify(result)
        }
    },
    // RSA
    RSA: {
        /**
         * RSA 加密
         * @param data 待加密内容
         * @returns {string | false} 加密后结果
         */
        encrypt: (data) => {
            let encryptor = new JSEncrypt()
            encryptor.setPublicKey(config.RSA_PUBLIC_KEY)
            return encryptor.encrypt(data)
        },
        /**
         * RSA 解密
         * @param cipher 待解密内容
         * @returns {string | false} 解密后结果
         */
        decrypt: (cipher) => {
            let encryptor = new JSEncrypt()
            encryptor.setPrivateKey(config.RSA_PRIVATE_KEY)
            return encryptor.decrypt(cipher)
        }
    }
}

export default crypto